﻿using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using CeA.Reports.Atendimento.DataAccess;
using CeA.Reports.Atendimento.DataAccess.Criteria;
using CeA.Reports.Atendimento.DataAccess.DAO;
using CeA.Reports.Atendimento.DataAccess.DAO.Oracle;
using Qtech.Reports.Atendimento.Services;
using CeA.Reports.Atendimento.DataAccess.DTO;
using System.Collections.Generic;

namespace CeA.Reports.Atendimento.Web.WebControls {
    public partial class FiltroServico : System.Web.UI.UserControl {
        private const int MAX_NUMBER_SELECTED_SERVICES = 1000;


        #region -- Event Model ------------------------------------------------------------------------

            // Event Keys
            private static readonly object FiltroEventKey = new object();

            
            // Delegates
            public delegate void FiltroServicoEventHandler(object sender, FiltroServicoEventArgs e);


            // Events
            public event FiltroServicoEventHandler Pesquisar                                {
                add {
                    Events.AddHandler(FiltroEventKey, value);
                }
                remove {
                    Events.RemoveHandler(FiltroEventKey, value);
                }
            }


            protected virtual void OnPesquisar(FiltroServicoEventArgs e)                    {
                FiltroServicoEventHandler handler = Events[FiltroEventKey] as FiltroServicoEventHandler;
                if (handler != null) {
                    handler(this, e);
                }
            }
        #endregion


        protected void Page_Init()                                                          {
            lstRFS.SelectedIndexChanged += new EventHandler(lstRFS_SelectedIndexChanged);
            lstRegiao.SelectedIndexChanged += new EventHandler(lstRegiao_SelectedIndexChanged);
            btnPesquisar.Click += new EventHandler(btnPesquisar_Click);
        }


        protected void Page_Load(object sender, EventArgs e)                                {
            if (Page.IsPostBack == false) {
                CarregaAllRfsListBox();
                CarregaAllRegiaoListBox();
                CarregaAllLojaListBox();
                CarregarAllServicoListBox();
                CarregarAnoMes();
            }
        }
        

        protected void lstRFS_SelectedIndexChanged(object sender, EventArgs e)              {
            CarregaAllRegiaoListBox();
            CarregaAllLojaListBox();
        }


        protected void lstRegiao_SelectedIndexChanged(object sender, EventArgs e)           {
            CarregaAllLojaListBox();
        }


        private void btnPesquisar_Click(object sender, EventArgs e)                         {
            try {
                FiltroServicoEventArgs args = new FiltroServicoEventArgs();
                args.Ano = Convert.ToInt32(ddlAno.SelectedValue);
                args.Mes = Convert.ToInt32(ddlMes.SelectedValue);

                foreach (ListItem servico in lstServicos.Items) {
                    if (servico.Selected)
                        args.addServico(Convert.ToInt32( servico.Value));
                }

                foreach (ListItem loja in lstLoja.Items) {
                    if (loja.Selected)
                        args.addLoja(Convert.ToInt32(loja.Value));
                }

                foreach (ListItem regiao in lstRegiao.Items)
                {
                    if (regiao.Selected)
                        args.addRegiao(Convert.ToInt32(regiao.Value));
                }

                foreach (ListItem rfs in lstRFS.Items)
                {
                    if (rfs.Selected)
                        args.addRfs(Convert.ToInt32(rfs.Value));
                }

                args.GeraGrafico = chkShowChart.Checked;
                args.ExportaRelatorio = chkExportRelatorio.Checked;

                OnPesquisar(args);

            } catch (Exception ex) {
                cvlMensagem.IsValid = false;
                cvlMensagem.Text = ex.Message;
            }
        }


        protected void ValidarServicoSelecionados(Object sender, ServerValidateEventArgs e) {
            int count = 0;
            foreach (ListItem servico in lstServicos.Items) {
                if (servico.Selected)
                    count++;
            }

            if (count > MAX_NUMBER_SELECTED_SERVICES)
                e.IsValid = false;
        }


        private void CarregaAllRfsListBox()                                                 {
            DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);
            Rfs daoRfs = factory.GetRfsDAO();
            RfsCriteria criteria = new RfsCriteria();

            lstRFS.DataSource = daoRfs.ListarIdentificacao(criteria);
            lstRFS.DataTextField = "nome";
            lstRFS.DataValueField = "id";

            lstRFS.DataBind();
            lstRFS.Items.Insert(0, new ListItem("-- Todos --", "0", true));
        }


        private void CarregaAllRegiaoListBox()                                              {
            DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);

            Regiao daoRegiao = factory.GetRegiaoDAO();
            RegiaoCriteria criteria = new RegiaoCriteria();

            if (lstRFS.SelectedIndex > 0)
                foreach (ListItem item in lstRFS.Items) {
                    if (item.Selected)
                        criteria.addRfs(Convert.ToInt32(item.Value));
                }

            lstRegiao.DataSource = daoRegiao.ListarIdentificacao(criteria);
            lstRegiao.DataTextField = "nome";
            lstRegiao.DataValueField = "id";

            lstRegiao.DataBind();
            lstRegiao.Items.Insert(0, new ListItem("-- Todos --", "0", true));
        }


        private void CarregaAllLojaListBox()                                                {
            DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);

            Loja daoLoja = factory.GetLojaDAO();
            LojaCriteria criteria = new LojaCriteria();

            //RFS
            if (lstRFS.SelectedIndex > 0)
                foreach (ListItem item in lstRFS.Items) {
                    if (item.Selected)
                        criteria.addRfs(Convert.ToInt32(item.Value));
                }

            //REGIÃO
            if(lstRegiao.SelectedIndex > 0)
                foreach (ListItem item in lstRegiao.Items) {
                    if (item.Selected)
                        criteria.addRegiao(Convert.ToInt32(item.Value));
                }

            lstLoja.DataSource = daoLoja.ListarIdentificacao(criteria);
            lstLoja.DataTextField = "nome";
            lstLoja.DataValueField = "id";

            lstLoja.DataBind();
            lstLoja.Items.Insert(0, new ListItem("-- Todos --", "0", true));
        }


        private void CarregarAllServicoListBox()                                            {
            List<ServicoDTO> list = CadastroFacade.FindServico();
            lstServicos.DataSource = list;

            lstServicos.DataTextField = "nome";
            lstServicos.DataValueField = "id";
            
            lstServicos.DataBind();
        }
    

        private void CarregarAnoMes()                                                       { 
            ddlMes.Items.Add(new ListItem("Janeiro",   "1"));
            ddlMes.Items.Add(new ListItem("Fevereiro", "2"));
            ddlMes.Items.Add(new ListItem("Março",     "3"));
            ddlMes.Items.Add(new ListItem("Abril",     "4"));
            ddlMes.Items.Add(new ListItem("Maio",      "5"));
            ddlMes.Items.Add(new ListItem("Junho",     "6"));
            ddlMes.Items.Add(new ListItem("Julho",     "7"));
            ddlMes.Items.Add(new ListItem("Agosto",    "8"));
            ddlMes.Items.Add(new ListItem("Setembro",  "9"));
            ddlMes.Items.Add(new ListItem("Outubro",   "10"));
            ddlMes.Items.Add(new ListItem("Novembro",  "11"));
            ddlMes.Items.Add(new ListItem("Dezembro",  "12"));

            for (int ano = 2009; ano <= 2016; ano++)
                ddlAno.Items.Add(new ListItem(ano.ToString(), ano.ToString()));

            ddlAno.SelectedValue = Convert.ToString(DateTime.Now.Year);
            ddlMes.SelectedValue = Convert.ToString(DateTime.Now.Month);
        }
    }
}